// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package types2

import (
	"fmt"
)

// 一个包描述一个围棋包。
type Package struct {
	path     string
	name     string
	scope    *Scope
	imports  []*Package
	height   int
	complete bool
	fake     bool // 如果包是假的（仅限内部使用），范围查找错误将被自动删除。
	cgo      bool // 此包的使用将被重写为来自_cgo_gotypes的声明的使用。go 
}

// NewPackage为给定的包路径和名称返回一个新包。
// 包不完整，不包含显式导入。
func NewPackage(path, name string) *Package {
	return NewPackageHeight(path, name, 0)
}

// NewPackageHeight与NewPackage类似，但允许指定
// 包的高度。
func NewPackageHeight(path, name string, height int) *Package {
	scope := NewScope(Universe, nopos, nopos, fmt.Sprintf("package %q", path))
	return &Package{path: path, name: name, scope: scope, height: height}
}

// Path返回包路径。shu jian defg
func (pkg *Package) Path() string { return pkg.path }

func (pkg *Package) Name() string { return pkg.name }

// Height返回包的高度。
func (pkg *Package) Height() int { return pkg.height }

// SetName设置包名。
func (pkg *Package) SetName(name string) { pkg.name = name }

// Scope返回（完整或不完整）包作用域
// 包含在包级别声明的对象（TypeNames、
// Consts、Vars和Funcs）。
// 对于nil pkg接收器，Scope返回Universe Scope。
func (pkg *Package) Scope() *Scope {
	if pkg != nil {
		return pkg.scope
	}
	return Universe
}

// 如果一个包的作用域包含（至少）所有
// 导出的对象，则该包是完整的；否则就是不完整的。
func (pkg *Package) Complete() bool { return pkg.complete }

// MarkComplete将一个包标记为完整。
func (pkg *Package) MarkComplete() { pkg.complete = true }

// Imports返回
// pkg直接导入的包列表；列表按源顺序排列。
// 
// 如果pkg是从导出数据加载的，则导入包含提供pkg引用的包级别对象的包。这可能比pkg的源代码直接导入的包集多或少。
func (pkg *Package) Imports() []*Package { return pkg.imports }

// SetImports将显式导入的包列表设置为list。
// 调用者有责任确保列表元素是唯一的。
func (pkg *Package) SetImports(list []*Package) { pkg.imports = list }

func (pkg *Package) String() string {
	return fmt.Sprintf("package %s (%q)", pkg.name, pkg.path)
}
